<?php
	class Images{
		var $inputName;                 //控件名
		var $allowType = array(
			'image/gif','image/jpg','image/jpeg','image/png','image/x-png','image/pjpeg'
		);	                           //上传类型
		var $allowSize = 5242880;	//限制大小
		var $saveDir = "/uploads/";      //保存目录
		var $isRename = true;               //是否重命名，默认为true
		var $errID = 0;                     //错误代码，默认为0
		var $errMsg = "";                   //错误信息
		var $savePath = "";                 //保存路径

		function __construct($inputName,$allowType="",$allowSize="",$saveDir="",$isRename=true) {
			if(empty($inputName)) {
				$this->chk_err(-1);       //无传入控件名
			} else {
				$this->inputName = $inputName;
			}

			if(!empty($allowType)) $this->allowType = $allowType;
			if(!empty($allowSize)) $this->allowSize = $allowSize;
			if(!empty($saveDir)) $this->saveDir = $saveDir;
			if(!empty($isRename)) $this->isRename = $isRename;
			$this->saveDir = $_SERVER['DOCUMENT_ROOT'].$this->saveDir;
		}	//end __construct

		function is_uploaded() {
			if(empty($_FILES[$this->inputName]['name'])) {
				$this->chk_err(4);    //没有文件被上传
			} else {
				if(is_uploaded_file($_FILES[$this->inputName]['tmp_name'])) {
					return true;
				} else {
					$this->chk_err(-2);       //文件上传不合法
				}
			}
		}	//end is_uploaded

		function chk_type(){
			if(!in_array($_FILES[$this->inputName]['type'],$this->allowType)){
				$this->chk_err(-3);         //上传的文件类型不被允许
			}else{
				return true;
			}
		}	//end chk_type

		function chk_size(){
			if($_FILES[$this->inputName]['size'] > $this->allowSize){
				$this->chk_err(-4);          //上传的文件过大
			}else{
				return true;
			}
		}	//end chk_size

		function move_uploaded(){        //移动上传文件
			if(!$this->is_uploaded()){
				return false;
			}

			if(!$this->chk_size()){
				return false;
			}

			if(!$this->chk_type()){
				return false;
			}

			//重命名
			if($this->isRename){
				$arrTmp = pathinfo($_FILES[$this->inputName]['name']);
				$extension = strtolower($arrTmp['extension']);
				$file_newname = date("YmdHis").rand(1000,9999)."00.".$extension; //重命名新文件， 00表示为上传的为原图
			}else{
				$file_newname = $_FILES[$this->inputName]['name'];
			}
			
			if(!file_exists($this->saveDir)){       //判断保存目录是否存在
				mkdir($this->saveDir,0777,true);    //建立保存目录
			}

			//移动文件
			$result = move_uploaded_file($_FILES[$this->inputName]['tmp_name'],$this->saveDir."/".$file_newname);

			if($result){
				$path = $this->savePath = $this->saveDir."".$file_newname;		//文件的成功保存路径

				$patharr = explode($_SERVER['DOCUMENT_ROOT'],$path);

				return $patharr[1];
			}else{
				$this->chk_err($_FILES[$this->inputName]['error']);
			}		
		}	//end move_uploaded

		//判断出错信息
		function chk_err($errID){
			$this->errID = $errID;
			switch($this->errID){
				case -4:
					$this->errMsg = "上传的文件过大";
					break;
				case -3:
					$this->errMsg = "上传的文件类型不被允许";
					break;
				case -2:
					$this->errMsg = "文件上传不合法";
					break;
				case -1:
					$this->errMsg = "无控件名传入";
					break;
				case 1:
					$this->errMsg = '上传的文件超出了php.ini中upload_max_filesize设定的最大值';
					break;
				case 2:
					$this->errMsg = '上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值';
					break;
				case 3:
					$this->errMsg = '文件只有部分被上传';
					break;
				case 4:
					$this->errMsg = '没有文件被上传';
					break;
				default:
					break;
			}
			return false;		
		}	//end chk_err

		function get_errMsg(){
			echo $this->errMsg;  //输出错误信息
		}	//end get_errMsg

		/**
		 +----------------------------------------------------------
		 * 取得图像信息
		 *
		 * @static
		 * @access public
		 * @param string $image 图像文件名
		 * @return mixed
		 +----------------------------------------------------------
		 */
		function getImageInfo($img) {
			$imageInfo = getimagesize($img);
			if( $imageInfo!== false) {
				$imageType = strtolower(substr(image_type_to_extension($imageInfo[2]),1));
				$imageSize = filesize($img);
				$info = array(
					"width"		=>$imageInfo[0],
					"height"	=>$imageInfo[1],
					"type"		=>$imageType,
					"size"		=>$imageSize,
					"mime"		=>$imageInfo['mime'],
				);
				return $info;
			}else {
				return false;
			}
		}	//end getImageInfo

		/**
		 +----------------------------------------------------------
		 * 生成缩略图
		 *
		 * @static
		 * @access public
		 * @param string $image  原图
		 * @param string $type 图像格式
		 * @param string $thumbname 缩略图文件名
		 * @param string $maxWidth  宽度
		 * @param string $maxHeight  高度
		 * @param string $position 缩略图保存目录
		 * @param boolean $interlace 启用隔行扫描
		 * @param boolean $is_save 是否保留原图
		 * @return void
		 +----------------------------------------------------------
		 */		 
		function thumb($image,$from,$is_save=true,$suofang=0,$type='',$maxWidth=300,$maxHeight=300,$interlace=true){
			// 获取原图信息

			$image = $_SERVER['DOCUMENT_ROOT'].$image;


		    $info  = $this->getImageInfo($image);
			 if($info !== false) {
				$srcWidth  = $info['width'];
				$srcHeight = $info['height'];
				$type = empty($type)?$info['type']:$type;
				$type = strtolower($type);
				$interlace  =  $interlace? 1:0;
				unset($info);


				if ($suofang==1) {
					$width  = $srcWidth;
					$height = $srcHeight;
				} else {
					$scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight); // 计算缩放比例
					if($scale>=1) {
						// 超过原图大小不再缩略
						$width   =  $srcWidth;
						$height  =  $srcHeight;
					}else{
						// 缩略图尺寸
						$width  = (int)($srcWidth*$scale);	//147
						$height = (int)($srcHeight*$scale);	//199
					}
				}


				// 载入原图
				$createFun = 'imagecreatefrom'.($type=='jpg'?'jpeg':$type);



				$srcImg     = $createFun($image);




				//创建缩略图
				if($type!='gif' && function_exists('imagecreatetruecolor')){
					$thumbImg = imagecreatetruecolor($width, $height);

                }

				else
					$thumbImg = imagecreate($width, $height);

				// 复制图片
				if(function_exists("ImageCopyResampled")){
					imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth,$srcHeight);

                }
				else
					imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height,  $srcWidth,$srcHeight);
				if('gif'==$type || 'png'==$type) {
					//imagealphablending($thumbImg, false);//取消默认的混色模式
					//imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息
					$background_color  =  imagecolorallocate($thumbImg,  0,255,0);  //  指派一个绿色
					imagecolortransparent($thumbImg,$background_color);  //  设置为透明色，若注释掉该行则输出绿色的图
				}
				// 对jpeg图形设置隔行扫描
				if('jpg'==$type || 'jpeg'==$type) 	imageinterlace($thumbImg,$interlace);
				//$gray=ImageColorAllocate($thumbImg,255,0,0);
				//ImageString($thumbImg,2,5,5,"ThinkPHP",$gray);
				// 生成图片
				$imageFun = 'image'.($type=='jpg'?'jpeg':$type); 
				$length = strlen("00.".$type) * (-1);
				$_type = substr($image,-4);
				$length = ($type != $_type ? $length+1 : $length);

				//裁剪
				if ($suofang==1) {
					
					$thumbname01 = substr_replace($image,"01.".$type,$length);		//大尺寸头像
					$thumbname02 = substr_replace($image,"02.".$type,$length);		//中尺寸头像
					$thumbname03 = substr_replace($image,"03.".$type,$length);		//小尺寸头像
					$imageFun($thumbImg,$thumbname01,100);
					$imageFun($thumbImg,$thumbname02,100);
					$imageFun($thumbImg,$thumbname03,100);
					
					if($from == 'group' )
						$ava_size = array('big'=>180,'middle'=>90,'small'=>50);
					elseif($from =='person')
						$ava_size = array('big'=>140,'middle'=>50,'small'=>30);
					

					$thumbImg01 = imagecreatetruecolor($ava_size['big'],$ava_size['big']);
					imagecopyresampled($thumbImg01,$thumbImg,0,0,$_POST['x'],$_POST['y'],$ava_size['big'],$ava_size['big'],$_POST['w'],$_POST['h']);

					$thumbImg02 = imagecreatetruecolor($ava_size['middle'],$ava_size['middle']);
					imagecopyresampled($thumbImg02,$thumbImg,0,0,$_POST['x'],$_POST['y'],$ava_size['middle'],$ava_size['middle'],$_POST['w'],$_POST['h']);
					
					$thumbImg03 = imagecreatetruecolor($ava_size['small'],$ava_size['small']);
					imagecopyresampled($thumbImg03,$thumbImg,0,0,$_POST['x'],$_POST['y'],$ava_size['small'],$ava_size['small'],$_POST['w'],$_POST['h']);

					$imageFun($thumbImg01,$thumbname01,100);
					$imageFun($thumbImg02,$thumbname02,100);
					$imageFun($thumbImg03,$thumbname03,100);
					
					//删除图片
					@unlink($image);
					
					imagedestroy($thumbImg01);
					imagedestroy($thumbImg02);
					imagedestroy($thumbImg03);
					imagedestroy($thumbImg);
					imagedestroy($srcImg);

					//返回包含大中小头像路径的数组
					return array('big' => $thumbname01 , 'middle' =>$thumbname02, 'small' => $thumbname03);	
				}else{

					if($is_save == false){
						//缩略图覆盖原图，缩略图的路径还是原图路径
						$imageFun($thumbImg,$image,100);
					}else{
						$thumbname03 = substr_replace($image,"04.".$type,$length);	//缩略图与原图同时存在，
						$imageFun($thumbImg,$thumbname03,100);

						imagedestroy($thumbImg);
						imagedestroy($srcImg);
						//return $thumbname03 ;					//返回缩略图的路径，字符串
						$patharr = explode($_SERVER['DOCUMENT_ROOT'],$thumbname03);
						return $patharr[1];
					}
				}
			 }
			 return false;
		} //end thumb
	} //end Images
///***************
//	./uploads/2011/6/23/201106231015231234985800.jpg	----->上传到服务器上的原始图
//	./uploads/2011/6/23/201106231015231234985801.jpg	----->裁剪的大头像  180*180
//	./uploads/2011/6/23/201106231015231234985802.jpg	----->裁剪的小头像	50*50
//	./uploads/2011/6/23/201106231015231234985803.jpg	----->裁剪的小头像	30*30
//	./uploads/2011/6/23/201106231015231234985804.jpg	----->超过规定尺寸后的缩略图